Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / meshchatx / src / backend / translator_handler.py

Displaying Raw • Download


meshchatx/src/backend/translator_handler.py 7eea421940d2baf28e6476c2736f889f5f3657a4 (7eea4219) Text, 19.82 KB

T8b949e# SPDX-License-Identifier: 0BSD

Tff7b72import T7ee787asyncio
Tff7b72import T7ee787concurrentT7ee787.T7ee787futures
Tff7b72import T7ee787os
Tff7b72import T7ee787re
Tff7b72import T7ee787shutil
Tff7b72import T7ee787subprocess
Tff7b72from T7ee787typing Tff7b72import Te6edf3Any

Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787http_url_guard Tff7b72import Tb4b4b4(
Te6edf3UnsafeOutboundUrlErrorTb4b4b4,
Te6edf3normalize_libretranslate_http_service_baseTb4b4b4,
Tb4b4b4)

Tff7b72tryTb4b4b4:
Tff7b72import T7ee787aiohttp

Te6edf3HAS_AIOHTTP Tff7b72= Tff7b72True
Tff7b72except Tf85149ImportErrorTb4b4b4:
Te6edf3HAS_AIOHTTP Tff7b72= Tff7b72False

Tff7b72tryTb4b4b4:
Tff7b72from T7ee787argostranslate Tff7b72import Te6edf3packageTb4b4b4, Te6edf3translate

Te6edf3HAS_ARGOS_LIB Tff7b72= Tff7b72True
Tff7b72except Tf85149ImportErrorTb4b4b4:
Te6edf3HAS_ARGOS_LIB Tff7b72= Tff7b72False

Te6edf3ARGOS_CLI_EXECUTABLE_NAMES Tff7b72= Tb4b4b4(Ta5d6ff"Ta5d6ffargos-translateTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffargostranslateTa5d6ff"Tb4b4b4)

Te6edf3_MAX_LIBRETRANSLATE_API_KEY_LEN Tff7b72= T79c0ff512


Tff7b72def Td2a8ff_normalize_optional_libretranslate_api_keyTb4b4b4(Te6edf3valueTb4b4b4: Tffa657str Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tffa657str Tff7b72| Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3value Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72None
Te6edf3key Tff7b72= Tffa657strTb4b4b4(Te6edf3valueTb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3keyTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72if Tffa657lenTb4b4b4(Te6edf3keyTb4b4b4) Tff7b72> Te6edf3_MAX_LIBRETRANSLATE_API_KEY_LENTb4b4b4:
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffLibreTranslate API key exceeds maximum lengthTa5d6ff"
Tff7b72raise Tf85149ValueErrorTb4b4b4(Te6edf3msgTb4b4b4)
Tff7b72return Te6edf3key


Tff7b72def Td2a8ff_find_argos_cli_executableTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657str Tff7b72| Tff7b72NoneTb4b4b4:
T8b949e"""Resolve the Argos CLI on PATH (checked at call time, not import time)."""
Tff7b72for Te6edf3name Tff7b72in Te6edf3ARGOS_CLI_EXECUTABLE_NAMESTb4b4b4:
Te6edf3path Tff7b72= Te6edf3shutilTff7b72.Td2a8ffwhichTb4b4b4(Te6edf3nameTb4b4b4)
Tff7b72if Te6edf3pathTb4b4b4:
Tff7b72return Te6edf3path
Tff7b72return Tff7b72None


Te6edf3LANGUAGE_CODE_TO_NAME Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffenTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffEnglishTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffGermanTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffesTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffSpanishTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fffrTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffFrenchTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffitTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffItalianTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffptTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffPortugueseTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffruTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffRussianTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffzhTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffChineseTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffjaTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffJapaneseTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffkoTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffKoreanTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffarTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffArabicTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffhiTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffHindiTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffnlTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffDutchTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffplTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffPolishTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftrTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffTurkishTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffsvTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffSwedishTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdaTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffDanishTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffnoTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffNorwegianTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fffiTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffFinnishTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffcsTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffCzechTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffroTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffRomanianTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffhuTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffHungarianTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffelTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffGreekTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffheTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffHebrewTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffthTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffThaiTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffviTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffVietnameseTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffIndonesianTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffukTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffUkrainianTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffbgTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffBulgarianTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffhrTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffCroatianTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffskTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffSlovakTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffslTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffSlovenianTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffetTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffEstonianTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflvTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffLatvianTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffltTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffLithuanianTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffmtTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffMalteseTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffgaTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffIrishTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffcyTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffWelshTa5d6ff"Tb4b4b4,
Tb4b4b4}


Tff7b72def Td2a8ff_sync_run_coroTb4b4b4(Te6edf3coroTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3asyncioTff7b72.Td2a8ffget_running_loopTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149RuntimeErrorTb4b4b4:
Tff7b72return Te6edf3asyncioTff7b72.Td2a8ffrunTb4b4b4(Te6edf3coroTb4b4b4)
Tff7b72with Te6edf3concurrentTff7b72.Td2a8fffuturesTff7b72.Td2a8ffThreadPoolExecutorTb4b4b4(Te6edf3max_workersTff7b72=T79c0ff1Tb4b4b4) Tff7b72as Te6edf3executorTb4b4b4:
Tff7b72return Te6edf3executorTff7b72.Td2a8ffsubmitTb4b4b4(Te6edf3asyncioTff7b72.Td2a8ffrunTb4b4b4, Te6edf3coroTb4b4b4)Tff7b72.Td2a8ffresultTb4b4b4(Tb4b4b4)


Tff7b72class T56d364TranslatorHandlerTb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3libretranslate_urlTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3libretranslate_api_keyTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3translator_argos_enabledTb4b4b4: Tffa657bool Tff7b72= Tff7b72FalseTb4b4b4,
Te6edf3translator_libretranslate_enabledTb4b4b4: Tffa657bool Tff7b72= Tff7b72FalseTb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fftranslator_argos_enabled Tff7b72= Te6edf3translator_argos_enabled
Tff7b72selfTff7b72.Td2a8fftranslator_libretranslate_enabled Tff7b72= Te6edf3translator_libretranslate_enabled
Tff7b72selfTff7b72.Td2a8fflibretranslate_url Tff7b72= Te6edf3libretranslate_url Tff7b72or Te6edf3osTff7b72.Td2a8ffgetenvTb4b4b4(
Ta5d6ff"Ta5d6ffLIBRETRANSLATE_URLTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffhttp://localhost:5000Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflibretranslate_api_key Tff7b72= Te6edf3_normalize_optional_libretranslate_api_keyTb4b4b4(
Te6edf3libretranslate_api_key
Tff7b72if Te6edf3libretranslate_api_key Tff7b72is Tff7b72not Tff7b72None
Tff7b72else Te6edf3osTff7b72.Td2a8ffgetenvTb4b4b4(Ta5d6ff"Ta5d6ffLIBRETRANSLATE_API_KEYTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffhas_argos_lib Tff7b72= Te6edf3HAS_ARGOS_LIB
Tff7b72selfTff7b72.Td2a8ff_argos_cli_executable Tff7b72= Te6edf3_find_argos_cli_executableTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffhas_argos_cli Tff7b72= Tff7b72selfTff7b72.Td2a8ff_argos_cli_executable Tff7b72is Tff7b72not Tff7b72None
Tff7b72selfTff7b72.Td2a8ffhas_argos Tff7b72= Tff7b72selfTff7b72.Td2a8ffhas_argos_lib Tff7b72or Tff7b72selfTff7b72.Td2a8ffhas_argos_cli
Tff7b72selfTff7b72.Td2a8ffhas_requests Tff7b72= Te6edf3HAS_AIOHTTP

Tff7b72def Td2a8ff_any_backend_config_enabledTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8fftranslator_argos_enabled Tff7b72or Tff7b72selfTff7b72.Td2a8fftranslator_libretranslate_enabled

Tf0883e@property
Tff7b72def Td2a8ffenabledTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_any_backend_config_enabledTb4b4b4(Tb4b4b4)

Tf0883e@enabledTff7b72.Td2a8ffsetter
Tff7b72def Td2a8ffenabledTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3valueTb4b4b4: Tffa657boolTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftranslator_argos_enabled Tff7b72= Te6edf3value
Tff7b72selfTff7b72.Td2a8fftranslator_libretranslate_enabled Tff7b72= Te6edf3value

Tff7b72async Tff7b72def Td2a8ff_fetch_languages_asyncTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3urlTb4b4b4: Tffa657strTb4b4b4, Te6edf3api_keyTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3base Tff7b72= Te6edf3urlTff7b72.Td2a8ffrstripTb4b4b4(Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)
Te6edf3timeout Tff7b72= Te6edf3aiohttpTff7b72.Td2a8ffClientTimeoutTb4b4b4(Te6edf3totalTff7b72=T79c0ff5Tb4b4b4)
Te6edf3get_kwTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4] Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffallow_redirectsTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4}
Tff7b72if Te6edf3api_keyTb4b4b4:
Te6edf3get_kwTb4b4b4[Ta5d6ff"Ta5d6ffparamsTa5d6ff"Tb4b4b4] Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffapi_keyTa5d6ff"Tb4b4b4: Te6edf3api_keyTb4b4b4}
Tff7b72async Tff7b72with Te6edf3aiohttpTff7b72.Td2a8ffClientSessionTb4b4b4(Te6edf3timeoutTff7b72=Te6edf3timeoutTb4b4b4) Tff7b72as Te6edf3sessionTb4b4b4:
Tff7b72async Tff7b72with Te6edf3sessionTff7b72.Td2a8ffgetTb4b4b4(
Ta5d6fffTa5d6ff"Tffd700{Te6edf3baseTffd700}Ta5d6ff/languagesTa5d6ff"Tb4b4b4,
Tff7b72*Tff7b72*Te6edf3get_kwTb4b4b4,
Tb4b4b4) Tff7b72as Te6edf3responseTb4b4b4:
Tff7b72if Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff200Tb4b4b4:
Tff7b72return Tff7b72await Te6edf3responseTff7b72.Td2a8ffjsonTb4b4b4(Tb4b4b4)
Tff7b72return Tff7b72None

Tff7b72def Td2a8ffget_translator_languages_responseTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3libretranslate_urlTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
T8b949e"""List installed/reachable language pairs for the translator UI.

LibreTranslate is queried only when it is enabled in config or when the
caller passes ``libretranslate_url`` (non-empty) to probe a specific server.
"""
Te6edf3languagesTb4b4b4: Tffa657listTb4b4b4[Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Tffa657strTb4b4b4]Tb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3libretranslate_reachable Tff7b72= Tff7b72False

Te6edf3url Tff7b72= Te6edf3libretranslate_url Tff7b72or Tff7b72selfTff7b72.Td2a8fflibretranslate_url
Te6edf3explicit_override Tff7b72= Tb4b4b4(
Te6edf3libretranslate_url Tff7b72is Tff7b72not Tff7b72None Tff7b72and Tffa657strTb4b4b4(Te6edf3libretranslate_urlTb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4) Tff7b72!= Ta5d6ff"Ta5d6ff"
Tb4b4b4)
Te6edf3probe_libretranslate Tff7b72= Tb4b4b4(
Tff7b72selfTff7b72.Td2a8fftranslator_libretranslate_enabled Tff7b72or Te6edf3explicit_override
Tb4b4b4)
Te6edf3libre_base Tff7b72= Tff7b72None
Tff7b72if Tff7b72selfTff7b72.Td2a8ffhas_requests Tff7b72and Te6edf3probe_libretranslateTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3libre_base Tff7b72= Te6edf3normalize_libretranslate_http_service_baseTb4b4b4(Te6edf3urlTb4b4b4)
Tff7b72except Te6edf3UnsafeOutboundUrlError Tff7b72as Te6edf3eTb4b4b4:
Tff7b72if Te6edf3explicit_overrideTb4b4b4:
Te6edf3msg Tff7b72= Tffa657strTb4b4b4(Te6edf3eTb4b4b4)
Tff7b72raise Tf85149ValueErrorTb4b4b4(Te6edf3msgTb4b4b4) Tff7b72from T7ee787e
Te6edf3libre_base Tff7b72= Tff7b72None
Tff7b72if Te6edf3libre_base Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3api_key_eff Tff7b72= Te6edf3_normalize_optional_libretranslate_api_keyTb4b4b4(
Tff7b72selfTff7b72.Td2a8fflibretranslate_api_keyTb4b4b4,
Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3libretranslate_langs Tff7b72= Te6edf3_sync_run_coroTb4b4b4(
Tff7b72selfTff7b72.Td2a8ff_fetch_languages_asyncTb4b4b4(Te6edf3libre_baseTb4b4b4, Te6edf3api_key_effTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72if Te6edf3libretranslate_langs Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3libretranslate_reachable Tff7b72= Tff7b72True
Te6edf3languagesTff7b72.Td2a8ffextendTb4b4b4(
Tb4b4b4{
Ta5d6ff"Ta5d6ffcodeTa5d6ff"Tb4b4b4: Te6edf3langTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffcodeTa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Te6edf3langTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffsourceTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fflibretranslateTa5d6ff"Tb4b4b4,
Tb4b4b4}
Tff7b72for Te6edf3lang Tff7b72in Te6edf3libretranslate_langs
Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffFailed to fetch LibreTranslate languages: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffhas_argos_libTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3installed_packages Tff7b72= Te6edf3packageTff7b72.Td2a8ffget_installed_packagesTb4b4b4(Tb4b4b4)
Te6edf3argos_langs Tff7b72= Tffa657setTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3pkg Tff7b72in Te6edf3installed_packagesTb4b4b4:
Te6edf3argos_langsTff7b72.Td2a8ffaddTb4b4b4(Tb4b4b4(Te6edf3pkgTff7b72.Td2a8fffrom_codeTb4b4b4, Te6edf3pkgTff7b72.Td2a8fffrom_nameTb4b4b4)Tb4b4b4)
Te6edf3argos_langsTff7b72.Td2a8ffaddTb4b4b4(Tb4b4b4(Te6edf3pkgTff7b72.Td2a8ffto_codeTb4b4b4, Te6edf3pkgTff7b72.Td2a8ffto_nameTb4b4b4)Tb4b4b4)

Tff7b72for Te6edf3codeTb4b4b4, Te6edf3name Tff7b72in Tffa657sortedTb4b4b4(Te6edf3argos_langsTb4b4b4)Tb4b4b4:
Te6edf3languagesTff7b72.Td2a8ffappendTb4b4b4(
Tb4b4b4{
Ta5d6ff"Ta5d6ffcodeTa5d6ff"Tb4b4b4: Te6edf3codeTb4b4b4,
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Te6edf3nameTb4b4b4,
Ta5d6ff"Ta5d6ffsourceTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffargosTa5d6ff"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffFailed to fetch Argos languages: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffhas_argos_cliTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3cli_langs Tff7b72= Tff7b72selfTff7b72.Td2a8ff_get_argos_languages_cliTb4b4b4(Tb4b4b4)
Te6edf3languagesTff7b72.Td2a8ffextendTb4b4b4(Te6edf3cli_langsTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffFailed to fetch Argos languages via CLI: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)

Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6fflanguagesTa5d6ff"Tb4b4b4: Te6edf3languagesTb4b4b4,
Ta5d6ff"Ta5d6fflibretranslate_reachableTa5d6ff"Tb4b4b4: Te6edf3libretranslate_reachableTb4b4b4,
Tb4b4b4}

Tff7b72def Td2a8ffget_supported_languagesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3libretranslate_urlTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tffa657listTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffget_translator_languages_responseTb4b4b4(
Te6edf3libretranslate_urlTff7b72=Te6edf3libretranslate_urlTb4b4b4,
Tb4b4b4)Tb4b4b4[Ta5d6ff"Ta5d6fflanguagesTa5d6ff"Tb4b4b4]

Tff7b72def Td2a8fftranslate_textTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3textTb4b4b4: Tffa657strTb4b4b4,
Te6edf3source_langTb4b4b4: Tffa657strTb4b4b4,
Te6edf3target_langTb4b4b4: Tffa657strTb4b4b4,
Te6edf3use_argosTb4b4b4: Tffa657bool Tff7b72= Tff7b72FalseTb4b4b4,
Te6edf3libretranslate_urlTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3libretranslate_api_keyTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_any_backend_config_enabledTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffTranslator is disabledTa5d6ff"
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Te6edf3msgTb4b4b4)

Tff7b72if Tff7b72not Te6edf3textTb4b4b4:
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffText cannot be emptyTa5d6ff"
Tff7b72raise Tf85149ValueErrorTb4b4b4(Te6edf3msgTb4b4b4)

Tff7b72if Te6edf3use_argosTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8fftranslator_argos_enabled Tff7b72or Tff7b72not Tff7b72selfTff7b72.Td2a8ffhas_argosTb4b4b4:
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffArgos translation is not enabled or not availableTa5d6ff"
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Te6edf3msgTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_translate_argosTb4b4b4(Te6edf3textTb4b4b4, Te6edf3source_langTb4b4b4, Te6edf3target_langTb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8fftranslator_libretranslate_enabled Tff7b72and Tff7b72selfTff7b72.Td2a8ffhas_requestsTb4b4b4:
Te6edf3url_raw Tff7b72= Te6edf3libretranslate_url Tff7b72or Tff7b72selfTff7b72.Td2a8fflibretranslate_url
Tff7b72tryTb4b4b4:
Te6edf3url Tff7b72= Te6edf3normalize_libretranslate_http_service_baseTb4b4b4(Te6edf3url_rawTb4b4b4)
Tff7b72except Te6edf3UnsafeOutboundUrlError Tff7b72as Te6edf3eTb4b4b4:
Te6edf3msg Tff7b72= Tffa657strTb4b4b4(Te6edf3eTb4b4b4)
Tff7b72raise Tf85149ValueErrorTb4b4b4(Te6edf3msgTb4b4b4) Tff7b72from T7ee787e
Te6edf3api_key_eff Tff7b72= Te6edf3_normalize_optional_libretranslate_api_keyTb4b4b4(
Te6edf3libretranslate_api_key
Tb4b4b4)
Tff7b72if Te6edf3api_key_eff Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3api_key_eff Tff7b72= Te6edf3_normalize_optional_libretranslate_api_keyTb4b4b4(
Tff7b72selfTff7b72.Td2a8fflibretranslate_api_key
Tb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_translate_libretranslateTb4b4b4(
Te6edf3textTb4b4b4,
Te6edf3source_langTff7b72=Te6edf3source_langTb4b4b4,
Te6edf3target_langTff7b72=Te6edf3target_langTb4b4b4,
Te6edf3libretranslate_urlTff7b72=Te6edf3urlTb4b4b4,
Te6edf3api_keyTff7b72=Te6edf3api_key_effTb4b4b4,
Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fftranslator_argos_enabled Tff7b72and Tff7b72selfTff7b72.Td2a8ffhas_argosTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_translate_argosTb4b4b4(Te6edf3textTb4b4b4, Te6edf3source_langTb4b4b4, Te6edf3target_langTb4b4b4)
Tff7b72raise Te6edf3e

Tff7b72if Tff7b72selfTff7b72.Td2a8fftranslator_argos_enabled Tff7b72and Tff7b72selfTff7b72.Td2a8ffhas_argosTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_translate_argosTb4b4b4(Te6edf3textTb4b4b4, Te6edf3source_langTb4b4b4, Te6edf3target_langTb4b4b4)

Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffNo translation backend available. Install aiohttp for LibreTranslate or argostranslate for local translation.Ta5d6ff"
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Te6edf3msgTb4b4b4)

Tff7b72async Tff7b72def Td2a8ff_translate_libretranslate_asyncTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3textTb4b4b4: Tffa657strTb4b4b4,
Te6edf3source_langTb4b4b4: Tffa657strTb4b4b4,
Te6edf3target_langTb4b4b4: Tffa657strTb4b4b4,
Te6edf3libretranslate_urlTb4b4b4: Tffa657strTb4b4b4,
Te6edf3api_keyTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Te6edf3base Tff7b72= Te6edf3libretranslate_urlTff7b72.Td2a8ffrstripTb4b4b4(Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)
Te6edf3timeout Tff7b72= Te6edf3aiohttpTff7b72.Td2a8ffClientTimeoutTb4b4b4(Te6edf3totalTff7b72=T79c0ff30Tb4b4b4)
Te6edf3translate_bodyTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4] Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffqTa5d6ff"Tb4b4b4: Te6edf3textTb4b4b4,
Ta5d6ff"Ta5d6ffsourceTa5d6ff"Tb4b4b4: Te6edf3source_langTb4b4b4,
Ta5d6ff"Ta5d6fftargetTa5d6ff"Tb4b4b4: Te6edf3target_langTb4b4b4,
Ta5d6ff"Ta5d6ffformatTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fftextTa5d6ff"Tb4b4b4,
Tb4b4b4}
Tff7b72if Te6edf3api_keyTb4b4b4:
Te6edf3translate_bodyTb4b4b4[Ta5d6ff"Ta5d6ffapi_keyTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3api_key
Tff7b72async Tff7b72with Te6edf3aiohttpTff7b72.Td2a8ffClientSessionTb4b4b4(Te6edf3timeoutTff7b72=Te6edf3timeoutTb4b4b4) Tff7b72as Te6edf3sessionTb4b4b4:
Tff7b72async Tff7b72with Te6edf3sessionTff7b72.Td2a8ffpostTb4b4b4(
Ta5d6fffTa5d6ff"Tffd700{Te6edf3baseTffd700}Ta5d6ff/translateTa5d6ff"Tb4b4b4,
Te6edf3jsonTff7b72=Te6edf3translate_bodyTb4b4b4,
Te6edf3allow_redirectsTff7b72=Tff7b72FalseTb4b4b4,
Tb4b4b4) Tff7b72as Te6edf3responseTb4b4b4:
Tff7b72if Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72!= T79c0ff200Tb4b4b4:
Te6edf3body Tff7b72= Tff7b72await Te6edf3responseTff7b72.Td2a8fftextTb4b4b4(Tb4b4b4)
Te6edf3msg Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ffLibreTranslate API error: Tffd700{Te6edf3responseTff7b72.Td2a8ffstatusTffd700}Ta5d6ff - Tffd700{Te6edf3bodyTffd700}Ta5d6ff"
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Te6edf3msgTb4b4b4)
Te6edf3result Tff7b72= Tff7b72await Te6edf3responseTff7b72.Td2a8ffjsonTb4b4b4(Tb4b4b4)
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6fftranslated_textTa5d6ff"Tb4b4b4: Te6edf3resultTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftranslatedTextTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffsource_langTa5d6ff"Tb4b4b4: Te6edf3resultTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffdetectedLanguageTa5d6ff"Tb4b4b4, Tb4b4b4{Tb4b4b4}Tb4b4b4)Tff7b72.Td2a8ffgetTb4b4b4(
Ta5d6ff"Ta5d6fflanguageTa5d6ff"Tb4b4b4,
Te6edf3source_langTb4b4b4,
Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6fftarget_langTa5d6ff"Tb4b4b4: Te6edf3target_langTb4b4b4,
Ta5d6ff"Ta5d6ffsourceTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fflibretranslateTa5d6ff"Tb4b4b4,
Tb4b4b4}

Tff7b72def Td2a8ff_translate_libretranslateTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3textTb4b4b4: Tffa657strTb4b4b4,
Te6edf3source_langTb4b4b4: Tffa657strTb4b4b4,
Te6edf3target_langTb4b4b4: Tffa657strTb4b4b4,
Te6edf3libretranslate_urlTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3api_keyTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffhas_requestsTb4b4b4:
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffaiohttp library not availableTa5d6ff"
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Te6edf3msgTb4b4b4)

Te6edf3url Tff7b72= Te6edf3libretranslate_url Tff7b72or Tff7b72selfTff7b72.Td2a8fflibretranslate_url
Tff7b72return Te6edf3_sync_run_coroTb4b4b4(
Tff7b72selfTff7b72.Td2a8ff_translate_libretranslate_asyncTb4b4b4(
Te6edf3textTb4b4b4,
Te6edf3source_langTb4b4b4,
Te6edf3target_langTb4b4b4,
Te6edf3urlTb4b4b4,
Te6edf3api_keyTff7b72=Te6edf3api_keyTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)

Tff7b72def Td2a8ff_translate_argosTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3textTb4b4b4: Tffa657strTb4b4b4,
Te6edf3source_langTb4b4b4: Tffa657strTb4b4b4,
Te6edf3target_langTb4b4b4: Tffa657strTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Tff7b72if Te6edf3source_lang Tff7b72== Ta5d6ff"Ta5d6ffautoTa5d6ff"Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffhas_argos_libTb4b4b4:
Te6edf3detected_lang Tff7b72= Tff7b72selfTff7b72.Td2a8ff_detect_languageTb4b4b4(Te6edf3textTb4b4b4)
Tff7b72if Te6edf3detected_langTb4b4b4:
Te6edf3source_lang Tff7b72= Te6edf3detected_lang
Tff7b72elseTb4b4b4:
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffCould not auto-detect language. Please select a source language manually.Ta5d6ff"
Tff7b72raise Tf85149ValueErrorTb4b4b4(Te6edf3msgTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3msg Tff7b72= Tb4b4b4(
Ta5d6ff"Ta5d6ffAuto-detection is not supported with CLI-only installation. Ta5d6ff"
Ta5d6ff"Ta5d6ffPlease select a source language manually or install the Python library: pip install argostranslateTa5d6ff"
Tb4b4b4)
Tff7b72raise Tf85149ValueErrorTb4b4b4(Te6edf3msgTb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffhas_argos_libTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_translate_argos_libTb4b4b4(Te6edf3textTb4b4b4, Te6edf3source_langTb4b4b4, Te6edf3target_langTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffhas_argos_cliTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_translate_argos_cliTb4b4b4(Te6edf3textTb4b4b4, Te6edf3source_langTb4b4b4, Te6edf3target_langTb4b4b4)
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffArgos Translate not available (neither library nor CLI)Ta5d6ff"
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Te6edf3msgTb4b4b4)

Tff7b72def Td2a8ff_translate_argos_libTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3textTb4b4b4: Tffa657strTb4b4b4,
Te6edf3source_langTb4b4b4: Tffa657strTb4b4b4,
Te6edf3target_langTb4b4b4: Tffa657strTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3installed_packages Tff7b72= Te6edf3packageTff7b72.Td2a8ffget_installed_packagesTb4b4b4(Tb4b4b4)
Te6edf3translation_package Tff7b72= Tff7b72None

Tff7b72for Te6edf3pkg Tff7b72in Te6edf3installed_packagesTb4b4b4:
Tff7b72if Te6edf3pkgTff7b72.Td2a8fffrom_code Tff7b72== Te6edf3source_lang Tff7b72and Te6edf3pkgTff7b72.Td2a8ffto_code Tff7b72== Te6edf3target_langTb4b4b4:
Te6edf3translation_package Tff7b72= Te6edf3pkg
Tff7b72break

Tff7b72if Te6edf3translation_package Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3msg Tff7b72= Tb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffNo translation package found for Tffd700{Te6edf3source_langTffd700}Ta5d6ff -> Tffd700{Te6edf3target_langTffd700}Ta5d6ff. Ta5d6ff"
Ta5d6ff"Ta5d6ffInstall packages using: argostranslate --update-languagesTa5d6ff"
Tb4b4b4)
Tff7b72raise Tf85149ValueErrorTb4b4b4(Te6edf3msgTb4b4b4)

Te6edf3translated_text Tff7b72= Te6edf3translateTff7b72.Td2a8fftranslateTb4b4b4(Te6edf3textTb4b4b4, Te6edf3source_langTb4b4b4, Te6edf3target_langTb4b4b4)
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6fftranslated_textTa5d6ff"Tb4b4b4: Te6edf3translated_textTb4b4b4,
Ta5d6ff"Ta5d6ffsource_langTa5d6ff"Tb4b4b4: Te6edf3source_langTb4b4b4,
Ta5d6ff"Ta5d6fftarget_langTa5d6ff"Tb4b4b4: Te6edf3target_langTb4b4b4,
Ta5d6ff"Ta5d6ffsourceTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffargosTa5d6ff"Tb4b4b4,
Tb4b4b4}
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3msg Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ffArgos Translate error: Tffd700{Te6edf3eTffd700}Ta5d6ff"
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Te6edf3msgTb4b4b4) Tff7b72from T7ee787e

Tff7b72def Td2a8ff_translate_argos_cliTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3textTb4b4b4: Tffa657strTb4b4b4,
Te6edf3source_langTb4b4b4: Tffa657strTb4b4b4,
Te6edf3target_langTb4b4b4: Tffa657strTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Tff7b72if Te6edf3source_lang Tff7b72== Ta5d6ff"Ta5d6ffautoTa5d6ff" Tff7b72or Tff7b72not Te6edf3source_langTb4b4b4:
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffAuto-detection is not supported with CLI. Please select a source language manually.Ta5d6ff"
Tff7b72raise Tf85149ValueErrorTb4b4b4(Te6edf3msgTb4b4b4)

Tff7b72if Tff7b72not Te6edf3target_langTb4b4b4:
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffTarget language is required.Ta5d6ff"
Tff7b72raise Tf85149ValueErrorTb4b4b4(Te6edf3msgTb4b4b4)

Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3source_langTb4b4b4, Tffa657strTb4b4b4) Tff7b72or Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3target_langTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffLanguage codes must be strings.Ta5d6ff"
Tff7b72raise Tf85149ValueErrorTb4b4b4(Te6edf3msgTb4b4b4)

Tff7b72if Tffa657lenTb4b4b4(Te6edf3source_langTb4b4b4) Tff7b72!= T79c0ff2 Tff7b72or Tffa657lenTb4b4b4(Te6edf3target_langTb4b4b4) Tff7b72!= T79c0ff2Tb4b4b4:
Te6edf3msg Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ffInvalid language codes: Tffd700{Te6edf3source_langTffd700}Ta5d6ff -> Tffd700{Te6edf3target_langTffd700}Ta5d6ff"
Tff7b72raise Tf85149ValueErrorTb4b4b4(Te6edf3msgTb4b4b4)

Te6edf3executable Tff7b72= Tff7b72selfTff7b72.Td2a8ff_argos_cli_executable Tff7b72or Te6edf3_find_argos_cli_executableTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3executableTb4b4b4:
Te6edf3msg Tff7b72= Tb4b4b4(
Ta5d6ff"Ta5d6ffArgos Translate CLI not found in PATH Ta5d6ff"
Ta5d6fffTa5d6ff"Ta5d6ff(tried: Tffd700{Ta5d6ff'Ta5d6ff, Ta5d6ff'Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3ARGOS_CLI_EXECUTABLE_NAMESTb4b4b4)Tffd700}Ta5d6ff)Ta5d6ff"
Tb4b4b4)
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Te6edf3msgTb4b4b4)

Tff7b72tryTb4b4b4:
Te6edf3args Tff7b72= Tb4b4b4[
Te6edf3executableTb4b4b4,
Ta5d6ff"Ta5d6ff--from-langTa5d6ff"Tb4b4b4,
Te6edf3source_langTb4b4b4,
Ta5d6ff"Ta5d6ff--to-langTa5d6ff"Tb4b4b4,
Te6edf3target_langTb4b4b4,
Te6edf3textTb4b4b4,
Tb4b4b4]
Te6edf3result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Te6edf3argsTb4b4b4, Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4, Te6edf3textTff7b72=Tff7b72TrueTb4b4b4, Te6edf3checkTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3translated_text Tff7b72= Te6edf3resultTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3translated_textTb4b4b4:
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffTranslation returned empty resultTa5d6ff"
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Te6edf3msgTb4b4b4)
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6fftranslated_textTa5d6ff"Tb4b4b4: Te6edf3translated_textTb4b4b4,
Ta5d6ff"Ta5d6ffsource_langTa5d6ff"Tb4b4b4: Te6edf3source_langTb4b4b4,
Ta5d6ff"Ta5d6fftarget_langTa5d6ff"Tb4b4b4: Te6edf3target_langTb4b4b4,
Ta5d6ff"Ta5d6ffsourceTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffargosTa5d6ff"Tb4b4b4,
Tb4b4b4}
Tff7b72except Te6edf3subprocessTff7b72.Td2a8ffCalledProcessError Tff7b72as Te6edf3eTb4b4b4:
Te6edf3error_msg Tff7b72= Tb4b4b4(
Te6edf3eTff7b72.Td2a8ffstderrTff7b72.Td2a8ffdecodeTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3eTff7b72.Td2a8ffstderrTb4b4b4, Tffa657bytesTb4b4b4)
Tff7b72else Tb4b4b4(Te6edf3eTff7b72.Td2a8ffstderr Tff7b72or Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Tb4b4b4)
Te6edf3msg Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ffArgos Translate CLI error: Tffd700{Te6edf3error_msgTffd700}Ta5d6ff"
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Te6edf3msgTb4b4b4) Tff7b72from T7ee787e
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3msg Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ffArgos Translate CLI error: Tffd700{Te6edf3eTffd700!s}Ta5d6ff"
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Te6edf3msgTb4b4b4) Tff7b72from T7ee787e

Tff7b72def Td2a8ff_detect_languageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657str Tff7b72| Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffhas_argos_libTb4b4b4:
Tff7b72return Tff7b72None

Tff7b72tryTb4b4b4:
Tff7b72from T7ee787argostranslate Tff7b72import Te6edf3translate

Te6edf3installed_packages Tff7b72= Te6edf3packageTff7b72.Td2a8ffget_installed_packagesTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3installed_packagesTb4b4b4:
Tff7b72return Tff7b72None

Te6edf3detected Tff7b72= Te6edf3translateTff7b72.Td2a8ffdetect_languageTb4b4b4(Te6edf3textTb4b4b4)
Tff7b72if Te6edf3detectedTb4b4b4:
Tff7b72return Te6edf3detectedTff7b72.Td2a8ffcode
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffLanguage detection failed: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)

Tff7b72return Tff7b72None

Tff7b72def Td2a8ff_get_argos_languages_cliTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657listTb4b4b4[Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Tffa657strTb4b4b4]Tb4b4b4]Tb4b4b4:
Te6edf3languages Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3argospm Tff7b72= Te6edf3shutilTff7b72.Td2a8ffwhichTb4b4b4(Ta5d6ff"Ta5d6ffargospmTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3argospmTb4b4b4:
Tff7b72return Te6edf3languages

Tff7b72tryTb4b4b4:
Te6edf3result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(
Tb4b4b4[Te6edf3argospmTb4b4b4, Ta5d6ff"Ta5d6fflistTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3textTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3timeoutTff7b72=T79c0ff10Tb4b4b4,
Te6edf3checkTff7b72=Tff7b72TrueTb4b4b4,
Tb4b4b4)
Te6edf3installed_packages Tff7b72= Te6edf3resultTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3argos_langs Tff7b72= Tffa657setTb4b4b4(Tb4b4b4)

Tff7b72for Te6edf3pkg_name Tff7b72in Te6edf3installed_packagesTb4b4b4:
Tff7b72if Tff7b72not Te6edf3pkg_nameTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72continue
Te6edf3match Tff7b72= Te6edf3reTff7b72.Td2a8ffmatchTb4b4b4(Ta5d6ffrTa5d6ff"Ta5d6fftranslate-([a-z]Tffd700{2}Ta5d6ff)_([a-z]Tffd700{2}Ta5d6ff)Ta5d6ff"Tb4b4b4, Te6edf3pkg_nameTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3matchTb4b4b4:
Te6edf3from_code Tff7b72= Te6edf3matchTff7b72.Td2a8ffgroupTb4b4b4(T79c0ff1Tb4b4b4)
Te6edf3to_code Tff7b72= Te6edf3matchTff7b72.Td2a8ffgroupTb4b4b4(T79c0ff2Tb4b4b4)
Te6edf3argos_langsTff7b72.Td2a8ffaddTb4b4b4(Te6edf3from_codeTb4b4b4)
Te6edf3argos_langsTff7b72.Td2a8ffaddTb4b4b4(Te6edf3to_codeTb4b4b4)

Tff7b72for Te6edf3code Tff7b72in Tffa657sortedTb4b4b4(Te6edf3argos_langsTb4b4b4)Tb4b4b4:
Te6edf3name Tff7b72= Te6edf3LANGUAGE_CODE_TO_NAMETff7b72.Td2a8ffgetTb4b4b4(Te6edf3codeTb4b4b4, Te6edf3codeTff7b72.Td2a8ffupperTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3languagesTff7b72.Td2a8ffappendTb4b4b4(
Tb4b4b4{
Ta5d6ff"Ta5d6ffcodeTa5d6ff"Tb4b4b4: Te6edf3codeTb4b4b4,
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Te6edf3nameTb4b4b4,
Ta5d6ff"Ta5d6ffsourceTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffargosTa5d6ff"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tff7b72except Te6edf3subprocessTff7b72.Td2a8ffCalledProcessError Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffargospm list failed: Tffd700{Te6edf3eTff7b72.Td2a8ffstderr Tff7b72or Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError parsing argospm output: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)

Tff7b72return Te6edf3languages

Tff7b72def Td2a8ffinstall_language_packageTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3package_nameTb4b4b4: Tffa657str Tff7b72= Ta5d6ff"Ta5d6fftranslateTa5d6ff"Tb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Te6edf3argospm Tff7b72= Te6edf3shutilTff7b72.Td2a8ffwhichTb4b4b4(Ta5d6ff"Ta5d6ffargospmTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3argospmTb4b4b4:
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffargospm not found in PATH. Install argostranslate first.Ta5d6ff"
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Te6edf3msgTb4b4b4)

Tff7b72tryTb4b4b4:
Te6edf3result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(
Tb4b4b4[Te6edf3argospmTb4b4b4, Ta5d6ff"Ta5d6ffinstallTa5d6ff"Tb4b4b4, Te6edf3package_nameTb4b4b4]Tb4b4b4,
Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3textTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3timeoutTff7b72=T79c0ff300Tb4b4b4,
Te6edf3checkTff7b72=Tff7b72TrueTb4b4b4,
Tb4b4b4)
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffsuccessTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4,
Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4: Ta5d6fffTa5d6ff"Ta5d6ffSuccessfully installed Tffd700{Te6edf3package_nameTffd700}Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffoutputTa5d6ff"Tb4b4b4: Te6edf3resultTff7b72.Td2a8ffstdoutTb4b4b4,
Tb4b4b4}
Tff7b72except Te6edf3subprocessTff7b72.Td2a8ffTimeoutExpired Tff7b72as Te6edf3eTb4b4b4:
Te6edf3msg Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ffInstallation of Tffd700{Te6edf3package_nameTffd700}Ta5d6ff timed out after 5 minutesTa5d6ff"
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Te6edf3msgTb4b4b4) Tff7b72from T7ee787e
Tff7b72except Te6edf3subprocessTff7b72.Td2a8ffCalledProcessError Tff7b72as Te6edf3eTb4b4b4:
Te6edf3msg Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ffFailed to install Tffd700{Te6edf3package_nameTffd700}Ta5d6ff: Tffd700{Te6edf3eTff7b72.Td2a8ffstderr Tff7b72or Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tffd700}Ta5d6ff"
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Te6edf3msgTb4b4b4) Tff7b72from T7ee787e
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3msg Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ffError installing Tffd700{Te6edf3package_nameTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700!s}Ta5d6ff"
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Te6edf3msgTb4b4b4) Tff7b72from T7ee787e


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────